package cn.mini.mybatis.mybatis.session;

import java.util.List;

/**
 * SqlSession 是 MyBatis 简化版的核心接口，提供基本的查询功能和获取 Mapper 动态代理的方法。
 */
public interface SqlSession {

    /**
     * 根据指定的SqlID获取一条记录的封装对象，并将结果映射到指定类型的对象列表中。
     *
     * @param <E>       结果对象的类型
     * @param statement SQL 语句的唯一标识，通常为 "命名空间.id" 的形式
     * @param parameter 查询参数
     * @return 查询结果对象列表，如果没有匹配的记录则返回空列表
     */
    <E> E selectOne(String statement, Object parameter);
    /**
     * 从数据库中查询多条记录，并将查询结果封装到指定类型的列表中。
     * 该方法支持传入参数，可根据参数动态构建 SQL 查询语句，以实现灵活的查询需求。
     *
     * @param <E>       列表中元素的类型，即查询结果记录所映射到的对象类型。
     * @param statement SQL 语句的唯一标识，通常遵循 "命名空间.id" 的格式，用于定位具体的查询 SQL 语句。
     * @param parameter 传递给 SQL 语句的参数对象，可用于动态设置查询条件，如筛选字段、排序规则等。
     * @return 包含查询结果对象的列表。如果没有匹配的记录，将返回一个空列表。
     */
    <E> List<E> selectList(String statement, Object parameter);
    /**
     * 向数据库中插入一条新记录，支持传入参数动态构建插入语句。
     * 此方法会根据指定的 SQL 语句唯一标识，执行对应的插入操作，
     * 并可通过传入参数来设置插入记录的字段值。
     *
     * @param statement SQL 语句的唯一标识，通常采用 "命名空间.id" 的格式，
     *                  用于定位具体的插入 SQL 语句。
     * @param parameter 传递给 SQL 语句的参数对象，可用于动态设置插入记录的字段值。
     * @return 返回本次插入操作所影响的数据库记录行数，
     *         正常情况下插入一条记录返回 1，若插入失败则返回 0。
     */
    int insert(String statement, Object parameter);

    /**
     * 更新数据库中的记录。
     * 该方法根据传入的 SQL 语句唯一标识和参数，执行数据库的更新操作，
     * 可用于修改表中的数据，如更新字段值、调整记录状态等。
     *
     * @param statement SQL 语句的唯一标识，通常采用 "命名空间.id" 的格式，用于定位具体的 SQL 语句。
     * @param parameter 传递给 SQL 语句的参数对象，可用于动态构建 SQL 语句中的条件和更新值。
     * @return 返回本次更新操作所影响的数据库记录行数，若没有记录被更新则返回 0。
     */
    int update(String statement, Object parameter);

    /**
     * 删除记录
     *
     * 该方法用于根据指定的 SQL 语句唯一标识和参数，执行数据库中的删除操作。
     * 执行成功后，会返回本次删除操作所影响的数据库记录行数。
     *
     * @param statement SQL 语句的唯一标识，通常遵循 "命名空间.id" 的格式，用于定位具体的 SQL 语句。
     * @param parameter 传递给 SQL 语句的参数对象，可用于动态构建 SQL 语句中的条件等部分。
     * @return 返回本次删除操作所影响的数据库记录行数，若没有记录被删除则返回 0。
     */
    int delete(String statement, Object parameter);

    /**
     * 获取指定类型的 Mapper 接口的动态代理对象。
     *
     * @param <T>  Mapper 接口的类型
     * @param type Mapper 接口的 Class 对象
     * @return 指定类型的 Mapper 接口的动态代理对象
     */
    <T> T getMapper(Class<T> type);


    public Configuration getConfiguration();
}

